package com.qfmy.common.utils;

import com.qfmy.core.constant.CommonConstants;
import com.qfmy.core.pojo.entity.ErrorCode;
import com.qfmy.core.pojo.exception.CustomException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @ClassName: UploadUtils
 * @author： zhengjt
 * @data： 2022/7/31 14:11
 * @version：1.0
 * @描述： 上传工具类
 */
public class UploadUtils {

    /**
     * 上传保存文件
     * @param file  需要上传的文件
     * @param savePath  保存路径
     */
    public static Map<String, String> uploadFile(MultipartFile file, String savePath) throws CustomException, IOException {

        /**
         * 1、先判断文件是否存在
         * 2、检查保存路径是否存在，如果不存在，默认一个保存路径
         * 3、检查文件大小，是否超过默认上传文件的最大值
         * 4、检查文件路径是否存在，不存在则新建该文件
         * 5、设定新的文件名（命名规则：时间 + "_"+ 随机数/UUID +后缀名）
         * 6、文件上传
         * 7、返回数据信息
         *      1） 文件名
         *      2） 文件路径（保存路径 + 新文件名）
         *      3） 保存地址（保存路径）
         *      4）
         * 8、
         * 9、
         */
        //  判断文件是否为空
        if (file.isEmpty()){
            throw new CustomException(ErrorCode.FILE_NULL);
        }
        //  检查文件大小
        if (file.getSize() > CommonConstants.FILE_MAXSIZE) {
            throw new CustomException(ErrorCode.FILE_MAX);
        }

        //  判断保存路径是否为空
        File pathFile = new File(savePath);
        if (!pathFile.exists()) {
            pathFile.mkdirs();
        }

        //  生成新的文件名
        //  时间戳
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        //  文件名
        String fileName = file.getName();
        //  文件后缀名
        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        //  随机数
        String random = Integer.toString(new Random().nextInt(1000));
        //  设定新的文件名（命名规则：时间 + "_"+ 随机数/UUID +后缀名）
        String newFileName = df.format(new Date()) + "_" + random + "." + fileExt;

        //  设置保存的文件路径（原保存路径 + 文件名）
        //  savePath = savePath + newFileName;

        //  上传的文件
        File uploadedFile = new File(savePath, newFileName);

        //  文件上传
        file.transferTo(uploadedFile);

        //  返回数据信息
        Map<String, String> resultMap = new HashMap<>();
        //  原文件名
        resultMap.put("fileName", fileName);
        //  文件上传后路径
        resultMap.put("fileUrl", savePath + newFileName);
        //  文件的保存路径
        resultMap.put("savePath", savePath);
        return resultMap;
    }


}
